package city.spring.modules.cardinfo.service.impl;

import city.spring.modules.cardinfo.entity.CardNumberEntity;
import city.spring.modules.cardinfo.entity.PhysicalCardChangeLogEntity;
import city.spring.modules.cardinfo.repository.CardNumberRepository;
import city.spring.modules.cardinfo.service.CardNumberService;
import city.spring.modules.cardinfo.service.PhysicalCardChangeLogService;
import city.spring.modules.cardinfo.vo.CardNumberEntityVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * Service：
 *
 * @author panxm
 * @date 2020-05-19 10:34:16
 */
@CacheConfig(cacheNames = {CardNumberServiceImpl.CACHE_NAME})
@Transactional(rollbackFor = Throwable.class)
@Service
public class CardNumberServiceImpl extends ServiceImpl<CardNumberRepository, CardNumberEntity> implements CardNumberService {
    private final PhysicalCardChangeLogService physicalCardChangeLogService;

    public CardNumberServiceImpl(PhysicalCardChangeLogService physicalCardChangeLogService) {
        this.physicalCardChangeLogService = physicalCardChangeLogService;
    }

    @Override
    public void saveCardNumber(CardNumberEntity entity) {
        this.save(entity);
        if (!entity.isCompletion()) {
            throw new RuntimeException("一卡通添加失败");
        }
    }

    @Override
    public void updateCardNumber(CardNumberEntity entity) {
        // 使用 updateById(entity); 修改数据时，将会修改 entity 对象中所有非null数据，如果某个字段为null，将会忽略该字段的修改
        this.updateById(entity);
        if (!entity.isCompletion()) {
            throw new RuntimeException("一卡通信息更新失败");
        }
    }

    @Override
    public void updatePhysics(CardNumberEntity entity) {
        // 更改卡片物理卡号的同时，保存更换记录   涉及两个表：卡片信息表、更换记录表
        // 方式一：第一次绑定物理卡号，不计入更换记录
        PhysicalCardChangeLogEntity physicalCardChangeLogEntity = new PhysicalCardChangeLogEntity(); // 物理卡更换记录  设置物理卡更换记录的内容（物理卡更换记录表）
        physicalCardChangeLogEntity.setOldCard(entity.getLastPhysicsCard()); // 最后更新的物理卡号赋给旧卡号
        entity.setLastPhysicsCard(entity.getPhysicsCard()); // 设置 现物理卡号 与 最后更新的物理卡号  一致
        physicalCardChangeLogEntity.setPersonId(entity.getPerson());
        physicalCardChangeLogEntity.setPersonType(entity.getPersonType());
        physicalCardChangeLogEntity.setNewCard(entity.getPhysicsCard());
        physicalCardChangeLogEntity.setReplaceTime(new Date());
        int countChange = physicalCardChangeLogService.changeCount(physicalCardChangeLogEntity.getPersonId()); // 计算累积更换次数
        physicalCardChangeLogEntity.setCounts(countChange + 1); // countChange：这次之前的更换次数
        if (!(physicalCardChangeLogEntity.getOldCard() == null) && !(physicalCardChangeLogEntity.getNewCard() == null)) {
            physicalCardChangeLogService.savePhysicalCardChangeLog(physicalCardChangeLogEntity);
        }

        // 方式二：第一次绑定物理卡号，也计入更换记录，旧卡号设为“无”，新卡号为第一次绑定的物理卡号

//        PhysicalCardChangeLogEntity physicalCardChangeLogEntity = new PhysicalCardChangeLogEntity(); // 物理卡更换记录  设置物理卡更换记录的内容（物理卡更换记录表）

        //如 卡片的 最后更新的物理卡号为null，更换记录表的oldCard为 无，即第一次给卡片配物理卡号，对应的更换记录的没有旧卡号，只有新卡号
//        if(entity.getLastPhysicsCard()==null){
//            physicalCardChangeLogEntity.setOldCard("无");
//        }
//        if(!(entity.getLastPhysicsCard() == null)){
//            physicalCardChangeLogEntity.setOldCard(entity.getLastPhysicsCard());
//
//        }
        // 设置 现物理卡号 与 最后更新的物理卡号  一致
//        entity.setLastPhysicsCard(entity.getPhysicsCard());
//        physicalCardChangeLogEntity.setPersonId(entity.getPerson());
//        physicalCardChangeLogEntity.setPersonType(entity.getPersonType());
//        physicalCardChangeLogEntity.setNewCard(entity.getPhysicsCard());
//        physicalCardChangeLogEntity.setReplaceTime(new Date());
//        physicalCardChangeLogService.savePhysicalCardChangeLog(physicalCardChangeLogEntity);

        this.updateById(entity);
        if (!entity.isCompletion()) {
            throw new RuntimeException("一卡通信息更新失败");
        }
    }

    @Override
    public void deleteCardNumber(String primaryKey) {
        removeById(primaryKey);
    }

    @Override
    public void deleteCardNumber(List<String> primaryKeys) {
        removeByIds(primaryKeys);
    }

    @Override
    public CardNumberEntity getCardNumber(String memberCard) {
        return baseMapper.getCardNumber(memberCard);
    }


    @Override
    public IPage<CardNumberEntityVO> listPage(Page<? extends CardNumberEntity> page, Wrapper<? extends CardNumberEntity> wrapper) {
        return baseMapper.listPage(page, wrapper);
    }

    @Override
    public IPage<CardNumberEntityVO> oldListPage(Page<? extends CardNumberEntity> page, Wrapper<? extends CardNumberEntity> wrapper) {
        return baseMapper.oldListPage(page, wrapper);
    }

    @Override
    public IPage<CardNumberEntityVO> staffListPage(Page<? extends CardNumberEntity> page, Wrapper<? extends CardNumberEntity> wrapper) {
        return baseMapper.staffListPage(page, wrapper);
    }

    @Override
    public CardNumberEntityVO getByPersonId(String personId) {
        return baseMapper.getByPersonId(personId);
    }

    @Override
    public IPage<CardNumberEntityVO> oldcardInfo(Page<? extends CardNumberEntity> page, Wrapper<? extends CardNumberEntity> wrapper) {
        return baseMapper.oldcardInfo(page, wrapper);
    }

}
